﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TS2015.Models;
using Kendo.Mvc.UI;
using Kendo.Mvc.Extensions;
using System.Data.Entity;
using System.Data.Entity.Validation;
using System.Text;
using System.Data.OleDb;
using System.Data;

namespace TS2015.Areas.Admin.Controllers
{
    public class AccoutManagementController : Controller
    {
        TS2015Context db = new TS2015Context();
        // GET: Admin/AccoutManagement
        int No = 0;
        List<SelectListItem> mess = new List<SelectListItem>();
        bool  CheckFuntion, CheckLink;
        int MaChucNang;
        #region Check Type
        bool CheckDateTime(string String)
        {
            DateTime Date;
            if (DateTime.TryParse(String, out Date))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        bool CheckInt(string String)
        {
            int Int;
            if (Int32.TryParse(String, out Int))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        bool CheckDouble(string String)
        {
            double Double;
            if (Double.TryParse(String, out Double))
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        #endregion
        #region Acting

        
        public ActionResult Acting()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("acting", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult ReadActing([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.TbQuyens.ToDataSourceResult(request));
        }

        public ActionResult DestroyActing([DataSourceRequest] DataSourceRequest request, TbQuyen data)
        {
            if (!CheckRole.IsRole("acting_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            try
            {
                if (data != null)
                {
                    TbQuyen itemdata = db.TbQuyens.First(item => item.MaQuyen == data.MaQuyen);
                    db.TbQuyens.Remove(itemdata);
                    db.SaveChanges();
                }
            }
            catch (Exception)
            {
                return this.Json(new DataSourceResult { Errors = "Bạn không thể xóa Quyền này! Dữ liệu liên quan đến Quyền này vẫn tồn tại!" });
            }

            return Json(ModelState.ToDataSourceResult());
        }

        #endregion
        #region Funtion

        public ActionResult GetFuntiontoExport()
        {
            var Funtions = from a in db.TbChucNangs
                           select new
                           {
                               MaCN = a.MaCN,
                               TenCN = a.TenCN,
                               Link = a.Link,
                               TenTat = a.TenTat,
                               MaCNCha = a.MaCNCha,
                               CssIcon = a.CssIcon,
                               TrangThai = a.TrangThai,
                               ThuTu = a.ThuTu,
                               IsMenu = a.IsMenu,
                               TenCNCha = db.TbChucNangs.Where(m => m.MaCN == a.MaCNCha).FirstOrDefault().TenCN
                           };
            return Json(Funtions.ToList(), JsonRequestBehavior.AllowGet);
        }

        public JsonResult GetFuntion()
        {
            //if (!CheckRole.IsRole("funtion", Session["Function"] as string[]))
            //    return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            var funtion = db.TbChucNangs.Where(m => m.IsMenu == true && m.TrangThai == 1).ToList();
            funtion.Insert(0, new TbChucNang() { MaCN = 0, TenCN = "Không" });
            return Json(funtion.ToList(), JsonRequestBehavior.AllowGet);
        }

        public ActionResult Funtion()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("funtion", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            if (db.TbChucNangs.ToList().Count > 0)
            {
                List<SelectListItem> list = new List<SelectListItem>();
                list.Add(new SelectListItem { Text = "Sử dụng", Value = "1" });
                list.Add(new SelectListItem { Text = "Không sử dụng", Value = "0" });
                ViewBag.TrangThai = list.OrderByDescending(e=>e.Value);

                List<SelectListItem> Menu = new List<SelectListItem>();
                Menu.Add(new SelectListItem { Text = "Đúng", Value = "1" });
                Menu.Add(new SelectListItem { Text = "Sai", Value = "0" });                

                // Lay danh sach menu

                var customerList = db.TbChucNangs.Where(m => m.IsMenu == true && m.TrangThai == 1).ToList();
                customerList.Insert(0, new TbChucNang() { MaCN = 0, TenCN = "Không" });

               ViewBag.ChucNang = customerList;
            }

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult ReadFuntion([DataSourceRequest] DataSourceRequest request)
        {
            return Json(db.TbChucNangs.ToDataSourceResult(request));
        }

        //[ValidateAntiForgeryToken]
        public ActionResult CreateFuntion([DataSourceRequest] DataSourceRequest request, TbChucNang data)
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("funtion_c", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                if (db.TbChucNangs.Where(m => m.TenCN.ToLower().Trim() == data.TenCN.ToLower().Trim() &&
                    m.MaCNCha == data.MaCNCha).Count() == 0)
                {
                    db.TbChucNangs.Add(data);
                    db.SaveChanges();
                }
                else
                {
                    return this.Json(new DataSourceResult { Errors = "Chức năng " + data.TenCN.Trim() + " đã tồn tại!" });
                }
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult UpdateFuntion([DataSourceRequest] DataSourceRequest request, TbChucNang data)
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("funtion_u", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult DestroyFuntion([DataSourceRequest] DataSourceRequest request, TbChucNang data)
        {
            if (!CheckRole.IsRole("funtion_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null)
            {
                try
                {
                    TbChucNang itemdata = db.TbChucNangs.Find(data.MaCN);
                    db.TbChucNangs.Remove(itemdata);
                    db.SaveChanges();
                }
                catch (Exception)
                {
                    return this.Json(new DataSourceResult { Errors = "Bạn không thể xóa Chức năng này! Dữ liệu liên quan đến Chức năng này vẫn tồn tại!" });
                }  
            }
            return Json(ModelState.ToDataSourceResult());
        }
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult ImportFuntion(HttpPostedFileBase FileImport)
        {
            bool state = false;
            if (FileImport != null)
            {
                // thuc hien thao tac tai day
                if (FileImport.ContentLength > 0)
                {
                    string Extension = System.IO.Path.GetExtension(FileImport.FileName);
                    if (Extension == ".xls" || Extension == ".xlsx")
                    {
                        string path = string.Concat(Server.MapPath("~/Uploads/File/" + DateTime.Now.ToString("MMddyyyyHHmmssfff") + FileImport.FileName));
                        //if (System.IO.File.Exists(path))
                        //{

                        //    System.IO.File.Delete(path);
                        //}
                        FileImport.SaveAs(path);
                        OleDbConnection oledbcon = new OleDbConnection("provider=microsoft.ace.oledb.12.0;data source=" + path + ";extended properties=excel 12.0;");
                        oledbcon.Open();
                        DataTable ExcelSheets = oledbcon.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                        string SpreadSheetName = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
                        OleDbCommand oledbcmd = new OleDbCommand("Select * from [" + SpreadSheetName + "]", oledbcon);
                        OleDbDataAdapter oledbda = new OleDbDataAdapter(oledbcmd);

                        DataTable dt = new DataTable();
                        var ListFuntions = db.TbChucNangs;
                        TbChucNang item;
                        oledbda.Fill(dt);
                        if (dt.Rows.Count > 0)
                        {
                            if (!dt.Columns.Contains("Tên chức năng"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Chức năng không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("Tên viết tắt"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Tên viết tắt không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("Link"))
                            {
                                mess.Add(new SelectListItem { Text = "Đường Link không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("Chức năng cha"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Chức năng cha không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("Là Menu"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Là Menu không tồn tại!" });
                                goto next;
                            }
                            if (!dt.Columns.Contains("Trạng thái"))
                            {
                                mess.Add(new SelectListItem { Text = "Cột Trạng thái không tồn tại!" });
                                goto next;
                            }

                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                if (dt.Rows[i]["Thứ tự"].ToString().Trim()!= "" && !CheckInt(dt.Rows[i]["Thứ tự"].ToString().Trim()))
                                {
                                    mess.Add(new SelectListItem { Text = "Thứ tự của Chức năng " + dt.Rows[i]["Tên chức năng"].ToString().Trim() + " phải là dạng số!" });
                                    continue;
                                }
                                if (!CheckInt(dt.Rows[i]["Trạng thái"].ToString().Trim()))
                                {
                                    mess.Add(new SelectListItem { Text = "Trạng thái của Chức năng " + dt.Rows[i]["Tên chức năng"].ToString().Trim() + " phải là dạng số!" });
                                    continue;
                                }
                                if (dt.Rows[i]["Chức năng cha"].ToString().Trim() == "")
                                {
                                    MaChucNang = 0;
                                }
                                else
                                {
                                    foreach (var a in ListFuntions)
                                    {
                                        if (a.TenCN.ToLower().Trim() == dt.Rows[i]["Chức năng cha"].ToString().ToLower().Trim())
                                        {
                                            MaChucNang = a.MaCN;
                                            break;
                                        }
                                    }
                                }
                                //foreach (var a in ListFuntions)
                                //{
                                //    CheckLink = false;
                                //    if (a.Link.ToLower().Trim() == dt.Rows[i]["Link"].ToString().ToLower().Trim())
                                //    {
                                //        CheckLink = true;
                                //        break;
                                //    }
                                //}
                                foreach (var a in ListFuntions)
                                {
                                    CheckFuntion = false;
                                    string Parent = dt.Rows[i]["Chức năng cha"].ToString().ToLower().Trim();
                                    if (Parent == "null" || Parent.Trim() == "")
                                    {
                                        if (a.TenCN.ToLower().Trim() == dt.Rows[i]["Tên chức năng"].ToString().ToLower().Trim())
                                        {
                                            CheckFuntion = true;
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        var idParent = db.TbChucNangs.Where(m => m.TenCN.ToLower().Trim() == Parent).FirstOrDefault().MaCN.ToString().Trim();
                                            if (a.TenCN.ToLower().Trim() == dt.Rows[i]["Tên chức năng"].ToString().ToLower().Trim() && a.MaCNCha.ToString().Trim() == idParent)
                                        {
                                            CheckFuntion = true;
                                            break;
                                        }
                                    }
                                    
                                }
                                //try
                                //{
                                if (!CheckFuntion)
                                {
                                    item = new TbChucNang();
                                    item.TenCN = dt.Rows[i]["Tên chức năng"].ToString().Trim();
                                    item.Link = dt.Rows[i]["Link"].ToString().Trim();
                                    item.TenTat = dt.Rows[i]["Tên viết tắt"].ToString().Trim();
                                    item.CssIcon = dt.Rows[i]["Icon"].ToString().Trim();
                                    if (dt.Rows[i]["Là Menu"].ToString().ToLower().Trim() == "đúng")
                                    {
                                        item.IsMenu = true;
                                    }
                                    else
                                    {
                                        item.IsMenu = false;
                                    }
                                    if (dt.Rows[i]["Thứ tự"].ToString().Trim() != "")
                                    {
                                        item.ThuTu = int.Parse(dt.Rows[i]["Thứ tự"].ToString().Trim());
                                    }
                                    item.MaCNCha = MaChucNang;
                                    item.TrangThai = int.Parse(dt.Rows[i]["Trạng thái"].ToString().Trim());
                                    db.TbChucNangs.Add(item);
                                    db.SaveChanges();
                                }
                                else
                                {
                                    mess.Add(new SelectListItem { Text = "CN " + dt.Rows[i]["Tên chức năng"].ToString() + " (CN cha: " + dt.Rows[i]["Chức năng cha"].ToString().Trim() + ") đã tồn tại!" });
                                }
                            }

                        next:
                            if (mess.Count() > 0)
                            {
                                state = false;
                                if (No > 0)
                                {
                                    mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                                }
                            }
                            else
                            {
                                state = true;
                                mess.Add(new SelectListItem { Text = "Thực hiện chèn thành công " + No + " bản ghi!" });
                            }
                        }
                        else
                        {
                            Response.Write("Bạn phải nhập file định dạng excel!");
                        }
                        oledbcon.Close();
                        System.IO.File.Delete(path);
                    }

                }
            }
            else
                mess.Add(new SelectListItem { Text = "Có lỗi" });

            return Json(new { State = state, Message = mess });
        }
        #endregion
        #region Add Acting
        public ActionResult AddActing(string id)
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("acting_u", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            List<TbChucNang> all = new List<TbChucNang>();
            all = db.TbChucNangs.ToList();
            var idrequest = db.TbChucNang_Quyen;
            List<SelectListItem> list = new List<SelectListItem>();
            list.Add(new SelectListItem { Text = "Hoạt động", Value = "1" });
            list.Add(new SelectListItem { Text = "Không hoạt động", Value = "0" });

            if (id != null && ModelState.IsValid)
            {               
                if (idrequest.Count() != 0)
                {
                    ViewBag.IDRequest = id;
                    int idacting = int.Parse(id);
                    var acting = db.TbQuyens.Where(m => m.MaQuyen == idacting).FirstOrDefault();
                    ViewBag.Funtion = db.TbChucNang_Quyen.Where(m => m.MaQuyen == idacting).Select(m => m.MaCN).ToArray();
                    ViewBag.TrangThai = new SelectList(list, "Value", "Text", acting.TrangThai);
                    ViewBag.Acting = acting.Quyen;
                }
            }
            else
            {
                if (!CheckRole.IsRole("acting_c", Session["Function"] as string[]))
                    return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

                ViewBag.TrangThai = new SelectList(list, "Value", "Text");
            }
            if (!Request.IsAjaxRequest())
                return View(all);

            return PartialView(all);
        }
        [HttpPost]
        [ActionName("AddActing")]
        public ActionResult Post_AddActing()
        {
            TbQuyen Quyen;
            TbChucNang_Quyen ChucNang_Quyen;
            if (Request.Form["checkedFiles"] != null)
            {
                string[] Checked = Request.Form["checkedFiles"].Split(',');
                var listActing = db.TbChucNangs.ToList();
                List<string> listofLast = new List<string>();
                foreach (var a in Checked)
                {
                    int Nephew = int.Parse(a.Trim());
                    var Child = listActing.Where(m => m.MaCN == Nephew).FirstOrDefault().MaCNCha;
                    if (Child != 0)
                    {
                        var Fahther = listActing.Where(m => m.MaCN == Child).FirstOrDefault().MaCNCha;
                        if (Fahther != 0)
                        {
                            listofLast.Add(Fahther.ToString());
                        }
                        listofLast.Add(Child.ToString());
                    }
                    listofLast.Add(a);
                }
                listofLast = listofLast.Distinct().ToList();

                if (Request.Form["MyActing"] != null)
                {
                    string nameacting = Request.Form["MyActing"].Trim();
                    int requestidacting = db.TbQuyens.AsNoTracking().Where(m => m.Quyen == nameacting).FirstOrDefault().MaQuyen;
                    //
                    //var idacting = db.TbQuyens.Where(m => m.Quyen == nameacting).FirstOrDefault().MaQuyen;
                    var listidfuntion_acting = db.TbChucNang_Quyen.Where(m => m.MaQuyen == requestidacting);
                    TbQuyen quyen = new TbQuyen();
                    //db.TbTinTucs.AsNoTracking().First(e => e.MaTinTuc == item.MaTinTuc).AnhDaiDien
                    quyen.MaQuyen = requestidacting;
                    quyen.Quyen = Request.Form["MyActing"].Trim();
                    quyen.TrangThai = int.Parse(Request.Form["Value"].Trim());
                    db.Entry(quyen).State = EntityState.Modified;
                    SaveChanges(db);
                    if (listidfuntion_acting != null)
                    {
                        foreach (var a in listidfuntion_acting)
                        {

                            db.TbChucNang_Quyen.Remove(a);
                        }
                        db.SaveChanges();
                    }
                    foreach (var a in listofLast)
                    {
                        ChucNang_Quyen = new TbChucNang_Quyen { MaQuyen = requestidacting, MaCN = int.Parse(a), TrangThai = true };
                        db.TbChucNang_Quyen.Add(ChucNang_Quyen);
                        db.SaveChanges();
                    }

                }
                else
                {
                    string actingname = Request.Form["txtActing"].Trim();

                    if (db.TbQuyens.Where(m => m.Quyen == actingname).Count() == 0)
                    {
                        Quyen = new TbQuyen { Quyen = actingname, TrangThai = int.Parse(Request.Form["Value"].Trim()) };
                        db.TbQuyens.Add(Quyen);
                        db.SaveChanges();
                        foreach (var a in listofLast)
                        {
                            ChucNang_Quyen = new TbChucNang_Quyen { MaQuyen = db.TbQuyens.Where(m => m.Quyen == actingname).FirstOrDefault().MaQuyen, MaCN = int.Parse(a), TrangThai = true };
                            db.TbChucNang_Quyen.Add(ChucNang_Quyen);
                            SaveChanges(db);
                        }
                    }
                }
            }
            else
            {
                if (Request.Form["MyActing"] != null)
                {
                    TbQuyen quyen = new TbQuyen();
                    quyen.MaQuyen = int.Parse(Request.Form["IDActing"].Trim());
                    quyen.Quyen = Request.Form["MyActing"].Trim();
                    quyen.TrangThai = int.Parse(Request.Form["Value"].Trim());
                    db.Entry(quyen).State = EntityState.Modified;
                }
                else
                {
                    string actingname = Request.Form["txtActing"].Trim();
                    if (db.TbQuyens.Where(m => m.Quyen == actingname).Count() == 0)
                    {
                        Quyen = new TbQuyen { Quyen = actingname, TrangThai = int.Parse(Request.Form["Value"].Trim()) };
                        db.TbQuyens.Add(Quyen);
                    }
                }
                SaveChanges(db);
            }
            return RedirectToAction("Acting");
        }
        #endregion
        #region List Accout
        public ActionResult AccountofCandidate()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("accofcandidate", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            List<SelectListItem> list = new List<SelectListItem>();
            list.Add(new SelectListItem { Text = "Hoạt động", Value = "0" });
            list.Add(new SelectListItem { Text = "Khóa", Value = "1" });
            ViewBag.Quyen = db.TbQuyens.ToList();
            ViewBag.TrangThai = list;

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }
        public ActionResult ReadAccountofCandidate([DataSourceRequest] DataSourceRequest request)
        {
            var Candidates = from a in db.TbNguoiDungs
                             join b in db.TbQuyens on a.MaQuyen equals b.MaQuyen
                             where b.Quyen.ToLower().Trim() == "thí sinh"
                             select a;

            return Json(Candidates.ToDataSourceResult(request));
        }
        //public ActionResult CreateAccountofCandidate([DataSourceRequest] DataSourceRequest request, TbNguoiDung data)
        //{
        //    if (!CheckRole.IsRole("accofcandidate_c", Session["Function"] as string[]))
        //        return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

        //    if (true)
        //    {
                
        //    }
        //    if (data != null && ModelState.IsValid)
        //    {
        //        data.MatKhau = DuLieuChung.MaHoaMD5(data.MatKhau);
        //        db.TbNguoiDungs.Add(data);
        //        db.SaveChanges();
        //    }
        //    return Json(ModelState.ToDataSourceResult());
        //}
        public ActionResult UpdateAccountofCandidate([DataSourceRequest] DataSourceRequest request, TbNguoiDung data)
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("accofcandidate_u", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult DestroyAccountofCandidate([DataSourceRequest] DataSourceRequest request, TbNguoiDung data)
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("accofcandidate_d", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            try
            {
                if (data != null)
                {
                    TbNguoiDung itemdata = db.TbNguoiDungs.First(item => item.TenDangNhap == data.TenDangNhap);
                    db.TbNguoiDungs.Remove(itemdata);
                    db.SaveChanges();
                }
            }
            catch (Exception)
            {
                return this.Json(new DataSourceResult { Errors = "Có lỗi trong quán trình xóa!" });
            }
            
            return Json(ModelState.ToDataSourceResult());
        }
        
        #endregion
       
        #region Users 

        public ActionResult Users()
        {
            Session["current_url"] = Request.Url.AbsoluteUri;
            if (!CheckRole.IsRole("account_users", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            List<SelectListItem> list = new List<SelectListItem>();
            list.Add(new SelectListItem { Text = "Hoạt động", Value = "0" });
            list.Add(new SelectListItem { Text = "Khóa", Value = "1" });
            ViewBag.Quyen = db.TbQuyens.ToList();
            ViewBag.TrangThai = list;

            if (!Request.IsAjaxRequest())
                return View();

            return PartialView();
        }

        public ActionResult ReadUser([DataSourceRequest] DataSourceRequest request)
        {
            if (!CheckRole.IsRole("account_users", Session["Function"] as string[]))
                return Content("Bạn chưa <a href='/Admin/Home/Login'>đăng nhập hệ thống</a> hoặc không có quyền sử dụng chức năng này.");

            var Users = from a in db.TbNguoiDungs
                             join b in db.TbQuyens on a.MaQuyen equals b.MaQuyen
                             where b.Quyen.ToLower().Trim() != "thí sinh"
                             select a;
            return Json(Users.ToDataSourceResult(request));
        }

        //[ValidateAntiForgeryToken]
        public ActionResult CreateUser([DataSourceRequest] DataSourceRequest request, TbNguoiDung data)
        {
            if (!CheckRole.IsRole("account_ctusers", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {           
                data.MatKhau = DuLieuChung.MaHoaMD5(data.MatKhau);
                db.TbNguoiDungs.Add(data);
                SaveChanges(db);
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult UpdateUser([DataSourceRequest] DataSourceRequest request, TbNguoiDung data)
        {
            if (!CheckRole.IsRole("account_udusers", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null && ModelState.IsValid)
            {
         
                db.Entry(data).State = EntityState.Modified;
                db.SaveChanges();
            }
            return Json(ModelState.ToDataSourceResult());
        }
        public ActionResult DestroyUser([DataSourceRequest] DataSourceRequest request, TbNguoiDung data)
        {
            if (!CheckRole.IsRole("account_dtusers", Session["Function"] as string[]))
                return this.Json(new DataSourceResult { Errors = "Bạn không có quyền thực hiện chức năng này!" });

            if (data != null)
            {
                TbNguoiDung itemdata = db.TbNguoiDungs.Find(data.TenDangNhap);
                db.TbNguoiDungs.Remove(itemdata);
                db.SaveChanges();
            }
       
            return Json(ModelState.ToDataSourceResult());
        }
        #endregion
        private void SaveChanges(DbContext context)
        {
            try
            {
                context.SaveChanges();
            }
            catch (DbEntityValidationException ex)
            {
                StringBuilder sb = new StringBuilder();

                foreach (var failure in ex.EntityValidationErrors)
                {
                    sb.AppendFormat("{0} failed validation\n", failure.Entry.Entity.GetType());
                    foreach (var error in failure.ValidationErrors)
                    {
                        sb.AppendFormat("- {0} : {1}", error.PropertyName, error.ErrorMessage);
                        sb.AppendLine();
                    }
                }

                throw new DbEntityValidationException(
                    "Entity Validation Failed - errors follow:\n" +
                    sb.ToString(), ex
                ); // Add the original exception as the innerException
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}